G-koodia moottoreille – LinuxCNC vs. muut liikeohjaimet

G-koodi on ohjelmointikieli, joka on säilynyt lähes muuttumattomana jo 60 vuotta. Se on yhä käytössä useimmissa 3D-tulostimissa, CNC-jyrsimissä ja laserleikkureissa – sekä monissa muissa laitteissa joissa tarvitaan tarkasti ohjattua kolmiulotteista liikettä. Yksinkertaisimmillaan G-koodi koostuu vain pisteistä toisensa perään:

G1 X0 Y0 Z0
G1 X1 Y0 Z0
G1 X1 Y1 Z0

Tässä G1 on käsky eli ”G-koodi”, joka tarkoittaa lineaarista liikettä. Muut standardit liikekäskyt ovat G0 eli nopea siirtymä ja G2/G3 kaareva liike. G-koodeja on kymmeniä muitakin, jotka säätävät laitteiston muita toimintoja kuten lämpötilaa tai jyrsinterän pyörimisnopeutta, mutta niiden merkitys vaihtelee laitetyypin mukaan.

G-koodissa on myös monipuolisempia ohjelmointitoimintoja, mukaanlukien aliohjelmat ja silmukat. Niitä käytetään kuitenkin varsin harvoin nykyään, koska G-koodia ei ohjelmoida suoraan vaan se tuotetaan toisella ohjelmalla. 3D-tulostimien tapauksessa tätä kutsutaan sliceriksi koska se ”siivuttaa” 3d-mallin tulostettaviin tasoihin. CNC-jyrsimissä puhutaan CAM-ohjelmasta, joka tulee sanoista Computer Aided Manufacturing.

Liikeohjaimet

Moottorien ohjaaminen G-koodin perusteella on tavallaan yksinkertaista, mutta vaikeudet piilevät yksityiskohdissa. Kun järjestelmässä on useita moottoreita, täytyy niiden liikkeet synkronoida tarkasti jotta suora viiva pysyy suorana eikä mutkittele. Tämä oli yksi ongelma johon törmäsin robokäden kanssa – sen liikeohjain oli suunniteltu tarkkaan paikoitukseen, mutta ei siihen että reitti pisteiden välillä olisi täsmällisen suora.

Toinen haaste on mekaniikan kiihtyvyys. G-koodi vain käskee lähtemään liikkeelle asetetulla nopeudella, mutta fyysiset esineet eivät voi muuttaa nopeuttaan yhtäkkisesti. Liikeohjaimen täytyy laskea nopeudelle väliarvoja, jotta kiihtyvyys pysyy halutulla tasolla eivätkä moottorit ylikuormitu tai liike muutu heilahdusten takia epätarkaksi. Samanlaiset laskut tarvitaan myös käännöksissä, joissa kokonaisnopeuden halutaan pysyvän vakiona mutta yksi akseli hidastuu ja toinen kiihdyttää.

Takaisinkytkentä

Edullisimmissa 3D-tulostimissa käytetään yleensä askelmoottoreita. Ne eivät pyöri itsestään, vaan ohjaimen täytyy kääntää askelmoottorin kahdelle kelalle kulkevan virran suuntaa jokaista askelta varten. Yleensä yhdessä kierroksessa on 200 askelta, ja ohjain pystyy näin pyörittämään moottoria tarkasti halutulla nopeudella ja haluttuun kohtaan.

Ongelmia tulee jos mekaniikka jumittaa jostain syystä. Akselmoottorin ylikuormittuessa se ”hukkaa steppejä” eli jättää askelia välistä, jolloin moottorin paikka ei ole enää se mitä ohjain kuvittelee. Vaikka yksi akseli jumittuisi täysin, jatkavat muut akselit liikettään ja seurauksena on joko iso möntti hukkaan mennyttä muovilankaa tai CNC-jyrsimen tapauksessa katkennut jyrsinterä.

Ratkaisu tähän ongelmaan on takaisinkytkentä: moottorin akselille asennetaan enkooderi eli pyörimisnopeusanturi. Näin moottori muuttuu servoksi, eli järjestelmäksi jossa moottorin ohjausta säädetään jatkuvasti sen todellisen asennon perusteella. Yleensä samalla on järkevää vaihtaa askelmoottori muun tyyppiseksi, esimerkiksi tavalliseksi DC-moottoriksi. Askelmoottoreissa on tarkkojen askelien saamiseksi käytetty voimakasta magneettikenttää ja kapeita rautasydämiä, mikä rajoittaa maksimivääntöä ja kierroslukualuetta. Kun tarkka paikoitus hoituu takaisinkytkennän avulla, voidaan käyttää muuten paremmin toimivia moottoritekniikoita.

Liikeohjainten ohjelmistot

Viimeisen vuosikymmenen aikana on tapahtunut paljon kehitystä 3D-tulostimien liikeohjaimissa. Yleisimmin käytetyt perustuvat Marlin– tai grbl-koodikantaan, joka on edullisille AVR-mikrokontrollereille tehty G-kooditulkin ja liikeohjaimen yhdistelmä. Parannellut versiot käyttävät yleensä tehokkaampaa mikrokontrolleria ja esimerkiksi liukulukulaskentaa, mutta ovat perusperiaatteiltaan samanlaisia. Toiminnallisuudessa näkyy monesti yksinkertaisuuden vuoksi jääneitä rajoitteita, esimerkiksi pause- ja abort-toiminnot tapahtuvat monen sekunnin viiveellä.

Toisenlaista lähestymistapaa edustaa mm. Klipper-projekti sekä kaupallinen Mach3 kun sitä käytetään ulkoisen ohjainkortin kanssa. Näissä G-kooditulkki toimii tavallisella PC-koneella, ja ainoastaan askelmoottorien ohjauspulssien generointi tapahtuu mikrokontrollerilla. Näin liikepolut ja kiihdytykset voidaan laskea tarkasti ja isolla määrällä välipisteitä, mutta PC:ltä ei vaadita kovin suurta reaaliaikaisuutta.

LinuxCNC tuo kaiken toiminnallisuuden PC:lle, myös reaaliaikapuolen. Tämä perustuu Linux-kernelin reaaliaikatoimintoihin, aiemmissa versioissa RTAI-projektiin ja myöhemmin kernelin päähaaran PREEMPT_RT-asetukseen. 3D-tulostinohjaimiin verrattuna LinuxCNC:n koodikanta on huomattavasti vanhempaa perua, sillä se on saanut alkunsa 1990-luvun alkupuolella NIST:n tutkimusprojektista. LinuxCNC:n pohjalta on tehty myös Machinekit-haaraprojekti, jonka tarkoituksena on modernisoida ohjelmistorakennetta ja lisätä tukea mm. Raspberry Pi:n käyttöön liikeohjaimena.

Ilman takaisinkytkentää lähestymistapojen erot jäävät vähäisiksi, ja erityisesti LinuxCNC:n konfiguraatio vaikuttaa tarpeettoman monimutkaiselta. Takaisinkytkennän kanssa tilanne muuttuu: LinuxCNC:ssä on triviaalia tuoda tieto moottorien reaaliaikaisesta sijainnista käyttöliittymälle. Kun kaikkien moottorien servo-ohjaus on samassa paikassa, on myös helppo verrata niiden liikkeitä toisiinsa ja reagoida ylikuormitustilanteisiin nopeasti.

Muiden liikeohjainten kanssa servo-ohjain on yleensä erikseen jokaiselle akselille, ja liikeohjaimelta tuodaan sille askelmoottoria varten tarkoitetut ohjauspulssit. Servo-ohjain päättelee näistä halutun moottorin asennon ja säätää moottorin pyörimisnopeuden sen saavuttamiseksi. Mutta mitä tapahtuu ylikuormitustilanteessa? Yksinkertaisimmillaan servo-ohjaimelta on kytketty pelkkä virhesignaali liikeohjaimelle, jonka vaikutus on pysäyttää kaikki liike jos moottorin asento on liian kaukana halutusta. Tällöin käyttöliittymä ei kuitenkaan tiedä missä moottori oikeasti on, ja tilanteesta toipuminen on haasteellista. Mach3:ssa on tuki myös tiedonvälitykselle takaisin tietyn merkkisiltä servo-ohjaimilta, jolloin käyttöliittymä voi omaan tahtiinsa kysyä tietoja. Yksittäiset harrastajat ovat kehittäneet vastaavia ratkaisuja muihinkin liikeohjaimiin, mutta niiden tuki erilaisille servo-ohjaimille on vaihtelevaa.

LinuxCNC on käytännössä edullisin tapa servo-ohjatun laitteen tekemiseen. Koska servo-ohjaus on tehty ohjelmallisesti, ei raudassa välttämättä tarvita kuin yksinkertainen H-silta moottoriohjaimeksi. Hacklabin CNC-projektiin päädyin ostamaan Mesa Electronicsin 6i25 FPGA-kortin, koska se vähentää PC:hen kohdistuvia reaaliaikavaatimuksia. FPGA-kortti maksoi n. 100 euroa, mikä on samaa hintaluokkaa kuin yhden akselin ulkoinen servo-ohjain. Moottoriohjaimen päädyin suunnittelemaan itse (tästä myöhemmin lisää), mutta valmiitkin DC-moottoriohjaimet ovat huomattavasti servo-ohjaimia yksinkertaisempia ja edullisempia.

LinuxCNC:n käyttöönotossa isoin kompastuskivi on sen mukautettavuus: lähes kaikki on valittavissa itse, ja se vaatii matalan tason ymmärrystä siitä mitä järjestelmässä pitäisi tapahtua. Machinekitiä en ole kokeillut, koska oma arvioni on toistaiseksi ollut ettei se tarjoa merkittävästi uutta mutta on heikommin dokumentoitu. Onneksi kokemusta on jo kertynyt Hacklabin ensimmäisen CNC:n kanssa, joka oli yksinkertainen askelmoottorilaite. Sille löytyi vielä valmiita esimerkkikonfiguraatioita, joten nyt on enemmän varmuutta lähteä tekemään omanlaisensa LinuxCNC-kokonaisuus.

Yksi kommentti artikkeliin ”G-koodia moottoreille – LinuxCNC vs. muut liikeohjaimet”

Jätä kommentti